using System;
using Karma.Framework.Core.Domain;

namespace Karma.Framework.Core.Repository
{
    /// <summary>
    /// Define las operaciones que que son permitidas sobre un objeto de dominio
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IEntityOperations<T> where T : DomainObject
    {
        /// <summary>
        /// Obtiene la isntancia definida dada la llave proporcionada
        /// </summary>
        /// <param name="primaryKey">El identificador de la entidad que se busca.</param>
        /// <returns>La entidad</returns>
        T Get(Int64 primaryKey);

        /// <summary>
        /// Elimina una entidad dado su identificador
        /// </summary>
        /// <param name="primaryKey">El identificador de la entidad que se desea eliminar.</param>
        void Delete(Int64 primaryKey);

        /// <summary>
        /// Actualiza los datos en la BD dada la instancia de la entidad
        /// </summary>
        /// <param name="instance">La instancia de la entidad.</param>
        T Update(T instance);

        /// <summary>
        /// Guarda una nueva isntancia en la BD.
        /// </summary>
        /// <param name="instance">La instancia a guardar</param>
        T Save(T instance);
    }
}